addHook("AbilitySpecial",  function(p)	
	if p.mo and p.mo.valid and p.mo.health and (p.mo.skin == "vanillatails") and not (p.pflags & PF_JUMPDOWN) and not (p.mo.eflags & MFE_UNDERWATER)
		if p.powers[pw_super] and p.hyper.capable == true and p.hyper.isunlocked == true
			p.hyper.tailsflying = true
			P_SetObjectMomZ(p.mo, 17*FRACUNIT, false)
			p.pflags = $1 & ~PF_SPINNING
			--p.flightcounter = $ + 1
		end
	end
end)
addHook("PlayerThink", function(p)
	if (p.mo.skin == "vanillatails")
		if p.powers[pw_super] and p.hyper.capable == true and p.hyper.isunlocked == true
			p.charability = CA_SWIM
			if not (p.mo.eflags & MFE_UNDERWATER)
				if p.hyper.tailsflying == true
					p.pflags = $ | PF_THOKKED
					if leveltime % 10 == 0 and p.hyper.tailsflying == true
						S_StartSound(p.mo, sfx_putput)
					end
					if leveltime % 10 == 0 and p.mo.state == S_PLAY_FLY_TIRED
						S_StartSound(p.mo, sfx_pudpud)
					end
					local flip = P_MobjFlip(p.mo)
					if p.mo.momz * flip < 0 and not (p.cmd.buttons & BT_USE)
						
						p.mo.momz = $ - P_GetMobjGravity(p.mo)*3/4
						if p.mo.momz/flip < -6*p.mo.scale then -- is the unflipped momz less than -6 * their scale?
							P_SetObjectMomZ(p.mo, -6*FRACUNIT) -- set to -6*FRACUNIT based off of flip and scale
						end
					end
					if not P_IsObjectOnGround(p.mo)
						if p.speed >= 40*FRACUNIT and p.mo.state != S_PLAY_RUN
							p.mo.state = S_PLAY_RUN
						end
						if p.speed < 40*FRACUNIT and p.mo.state != S_PLAY_FLY
							p.mo.state = S_PLAY_FLY
						end
					end
				end
			end
			if (p.mo.eflags & MFE_UNDERWATER) and p.mo.state == S_PLAY_FLY_TIRED
				p.mo.state = S_PLAY_SWIM
			end
		else
			if not p.mo.skin == "tails" and p.flightcounter != nil
				p.charability = skins[p.mo.skin].charability
			end
		end
		if P_IsObjectOnGround(p.mo)
			p.hyper.tailsflying = false
		end
	end
end)